iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Vibe Coding

Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用系列 第 25 篇

Day 25|狀態重構與目標刪除聯動:讓不同資料真正同步

  • 分享至 

  • xImage
  •  

今天進入第二十五今天的目標,使用 useContext 與 Custom Hook 重構 App 的狀態管理,
減少原本需要一層一層傳遞的 Props。
不過在完成重構後進行實際測試時,我發現「存錢目標」和「支出明細」之間還存在資料不同步的問題,
因此今天也順便把刪除功能重新整理,讓兩邊的資料可以互相連動。

用 useContext 整理全域狀態
之前像 Toast、語系、匯率等資料,需要透過 Props 從父元件一路傳到不同頁面。
這次改用 useContext 搭配 Custom Hook useAppContext,讓需要這些資料的元件可以直接取得。
原本:
App → Page → Component → Props → Component
重構後:
AppContext → 需要的元件直接使用
這樣可以減少 Prop Drilling,也讓不同頁面之間共享資料時更加方便。

測試後發現「刪除目標」沒有同步
完成 Context 重構後,我在測試時發現存錢功能有一個問題:
刪除「旅費」這個存錢目標後,原本存入旅費的那筆支出紀錄還留在明細裡。

也就是:
刪除目標 → 目標消失,但支出還存在
這會讓總結餘仍然被那筆存入目標的金額扣著。

反過來也有同樣的問題:
刪除存錢明細 → 明細消失,但目標進度沒有減少

因此我修改了 handleDeleteGoal,在使用者刪除目標時,同時找出屬於這個目標的明細:
https://ithelp.ithome.com.tw/upload/images/20260926/20183949Zv3LolKpWy.jpg

這裡我用了兩種方式比對:

  • goalId → 新資料可以直接透過 ID 找到目標
  • name → 舊資料沒有 goalId 時,可以透過名稱找到
    最後利用 filter() 把符合條件的明細移除。
    這樣刪除目標後,對應的支出紀錄也會一起消失,資金就會重新回到淨結餘。

反過來刪除明細,也要更新目標進度
如果使用者從明細頁直接刪除「存入目標」的紀錄,也必須把存錢目標的金額扣回來。
https://ithelp.ithome.com.tw/upload/images/20260926/20183949qUsh8IEFQF.jpg

這裡比較重要的是:
https://ithelp.ithome.com.tw/upload/images/20260926/20183949HhnbQECv9r.jpg
即使資料發生異常或重複扣除,也不會讓存錢目標變成負數。
整個資料流變成:
刪除明細 → 找到 goalId → 找到對應目標 → 扣除金額 → 更新目標進度
另外,我也加入 Toast,讓使用者知道目標進度已經同步修改。

批量刪除也要處理資料聯動
之前的批量刪除只會處理 items,這次則增加判斷:
選取的明細中有存錢紀錄 → 找到對應目標 → 同步扣除目標金額
這也讓我發現,新增一個功能時,不能只想到「正常操作」,還要思考:

  • 單筆刪除怎麼辦?
  • 批量刪除怎麼辦?
  • 從不同頁面操作會不會產生不同結果?
  • 兩份相關資料是否都會同步?
    這讓我知道做東西單純想出點子是不夠的,後面的測試跟優化也很重要,這些都會影響使用者的使用心得

總結:

  • useContext + Custom Hook 可以減少 Prop Drilling。
  • 有關聯的 State 必須注意同步問題。
  • filter() 可以用來清理與目標相關的明細。
  • Math.max(0, ...) 可以避免數值扣除後變成負數。
  • 單筆刪除和批量刪除都要考慮資料聯動。
  • 實際測試不只是確認功能能不能用,也是在找資料邏輯上的問題。
    重構不只是讓程式碼變得更漂亮,更重要的是重構之後,原本的功能和資料關係還要維持正確。

上一篇
Day 24|提示訊息與介面優化:讓操作結果被看見
系列文
Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言